package config

import (
	"fmt"
	log "github.com/sirupsen/logrus"
	"os"
	"path/filepath"
	"strings"
	"time"
)

type CustomFormatter struct{}

func (t *CustomFormatter) Format(entry *log.Entry) ([]byte, error) {
	var file string
	var len int
	if entry.Caller != nil {
		file = filepath.Base(entry.Caller.File)
		len = entry.Caller.Line
	}
	output := fmt.Sprintf("[%s][%s][%s:%d][%s]\n", entry.Time.Format("2006-01-02 15:04:05"), strings.ToUpper(entry.Level.String()), file, len, entry.Message)
	if err, ok := entry.Data[log.ErrorKey].(error); ok {
		output += fmt.Sprintf("%+v\n", err)
	}
	return []byte(output), nil
}
func init() {
	//显示文件名和行号
	log.SetReportCaller(true)
	log.SetFormatter(new(CustomFormatter))
	if GetConfig().Log.LogFile != "" {
		applogfile := fmt.Sprintf(GetConfig().Log.LogFile+"/devops-tools-%s.log", time.Now().Format("20060102"))
		logFile, err := os.OpenFile(applogfile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
		if err != nil {
			fmt.Println("无法创建日志文件:", err)
			return
		}
		log.SetOutput(logFile)
		go removeLogFile()
	}
}

func removeLogFile() {
	// 设置清理间隔（单位：秒） 60 * 60 * 24
	cleanInterval := 60 * 60 * 24 // 每天清理一次
	// 定时清理日志文件
	ticker := time.NewTicker(time.Duration(cleanInterval) * time.Second)
	defer ticker.Stop()
	for range ticker.C {
		// 获取当前时间
		now := time.Now()
		// 遍历日志文件夹中的所有文件
		err := filepath.Walk(GetConfig().Log.LogFile, func(path string, info os.FileInfo, err error) error {
			if err != nil {
				return err
			}
			if !strings.Contains(info.Name(), "kafka-lag-monitor") {
				return nil
			}
			// 如果文件是日志文件，并且修改时间早于当前时间减去清理间隔，则删除该文件
			if info.IsDir() || now.Sub(info.ModTime()).Hours() > float64(GetConfig().Log.MaxHistory*24) {
				err = os.Remove(path)
				if err != nil {
					log.Printf("删除文件失败 %s: %v", path, err)
				} else {
					log.Printf("已删除文件 %s", path)
				}
			}
			return nil
		})
		if err != nil {
			log.Fatal(err)
		}
	}
}
